// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "common/arc_strace.h"

#include <sys/syscall.h>
#include <string>

#include "base/strings/stringprintf.h"

#define CASE_ASSIGN_ENUM_STR(enum_sym, result)  \
  case enum_sym: result = #enum_sym ; break

namespace arc {

std::string GetArmSyscallStr(int arm_sysno) {
  std::string result;
  // Based on android/bionic/libc/kernel/arch-arm/asm/unistd.h.
  switch (arm_sysno) {
    case 1: return "__NR_exit";
    case 2: return "__NR_fork";
    case 3: return "__NR_read";
    case 4: return "__NR_write";
    case 5: return "__NR_open";
    case 6: return "__NR_close";
    case 8: return "__NR_creat";
    case 9: return "__NR_link";
    case 10: return "__NR_unlink";
    case 11: return "__NR_execve";
    case 12: return "__NR_chdir";
    case 13: return "__NR_time";
    case 14: return "__NR_mknod";
    case 15: return "__NR_chmod";
    case 16: return "__NR_lchown";
    case 19: return "__NR_lseek";
    case 20: return "__NR_getpid";
    case 21: return "__NR_mount";
    case 22: return "__NR_umount";
    case 23: return "__NR_setuid";
    case 24: return "__NR_getuid";
    case 25: return "__NR_stime";
    case 26: return "__NR_ptrace";
    case 27: return "__NR_alarm";
    case 29: return "__NR_pause";
    case 30: return "__NR_utime";
    case 33: return "__NR_access";
    case 34: return "__NR_nice";
    case 36: return "__NR_sync";
    case 37: return "__NR_kill";
    case 38: return "__NR_rename";
    case 39: return "__NR_mkdir";
    case 40: return "__NR_rmdir";
    case 41: return "__NR_dup";
    case 42: return "__NR_pipe";
    case 43: return "__NR_times";
    case 45: return "__NR_brk";
    case 46: return "__NR_setgid";
    case 47: return "__NR_getgid";
    case 49: return "__NR_geteuid";
    case 50: return "__NR_getegid";
    case 51: return "__NR_acct";
    case 52: return "__NR_umount2";
    case 54: return "__NR_ioctl";
    case 55: return "__NR_fcntl";
    case 57: return "__NR_setpgid";
    case 60: return "__NR_umask";
    case 61: return "__NR_chroot";
    case 62: return "__NR_ustat";
    case 63: return "__NR_dup2";
    case 64: return "__NR_getppid";
    case 65: return "__NR_getpgrp";
    case 66: return "__NR_setsid";
    case 67: return "__NR_sigaction";
    case 70: return "__NR_setreuid";
    case 71: return "__NR_setregid";
    case 72: return "__NR_sigsuspend";
    case 73: return "__NR_sigpending";
    case 74: return "__NR_sethostname";
    case 75: return "__NR_setrlimit";
    case 76: return "__NR_getrlimit";
    case 77: return "__NR_getrusage";
    case 78: return "__NR_gettimeofday";
    case 79: return "__NR_settimeofday";
    case 80: return "__NR_getgroups";
    case 81: return "__NR_setgroups";
    case 82: return "__NR_select";
    case 83: return "__NR_symlink";
    case 85: return "__NR_readlink";
    case 86: return "__NR_uselib";
    case 87: return "__NR_swapon";
    case 88: return "__NR_reboot";
    case 89: return "__NR_readdir";
    case 90: return "__NR_mmap";
    case 91: return "__NR_munmap";
    case 92: return "__NR_truncate";
    case 93: return "__NR_ftruncate";
    case 94: return "__NR_fchmod";
    case 95: return "__NR_fchown";
    case 96: return "__NR_getpriority";
    case 97: return "__NR_setpriority";
    case 99: return "__NR_statfs";
    case 100: return "__NR_fstatfs";
    case 102: return "__NR_socketcall";
    case 103: return "__NR_syslog";
    case 104: return "__NR_setitimer";
    case 105: return "__NR_getitimer";
    case 106: return "__NR_stat";
    case 107: return "__NR_lstat";
    case 108: return "__NR_fstat";
    case 111: return "__NR_vhangup";
    case 113: return "__NR_syscall";
    case 114: return "__NR_wait4";
    case 115: return "__NR_swapoff";
    case 116: return "__NR_sysinfo";
    case 117: return "__NR_ipc";
    case 118: return "__NR_fsync";
    case 119: return "__NR_sigreturn";
    case 120: return "__NR_clone";
    case 121: return "__NR_setdomainname";
    case 122: return "__NR_uname";
    case 124: return "__NR_adjtimex";
    case 125: return "__NR_mprotect";
    case 126: return "__NR_sigprocmask";
    case 128: return "__NR_init_module";
    case 129: return "__NR_delete_module";
    case 131: return "__NR_quotactl";
    case 132: return "__NR_getpgid";
    case 133: return "__NR_fchdir";
    case 134: return "__NR_bdflush";
    case 135: return "__NR_sysfs";
    case 136: return "__NR_personality";
    case 138: return "__NR_setfsuid";
    case 139: return "__NR_setfsgid";
    case 140: return "__NR__llseek";
    case 141: return "__NR_getdents";
    case 142: return "__NR__newselect";
    case 143: return "__NR_flock";
    case 144: return "__NR_msync";
    case 145: return "__NR_readv";
    case 146: return "__NR_writev";
    case 147: return "__NR_getsid";
    case 148: return "__NR_fdatasync";
    case 149: return "__NR__sysctl";
    case 150: return "__NR_mlock";
    case 151: return "__NR_munlock";
    case 152: return "__NR_mlockall";
    case 153: return "__NR_munlockall";
    case 154: return "__NR_sched_setparam";
    case 155: return "__NR_sched_getparam";
    case 156: return "__NR_sched_setscheduler";
    case 157: return "__NR_sched_getscheduler";
    case 158: return "__NR_sched_yield";
    case 159: return "__NR_sched_get_priority_max";
    case 160: return "__NR_sched_get_priority_min";
    case 161: return "__NR_sched_rr_get_interval";
    case 162: return "__NR_nanosleep";
    case 163: return "__NR_mremap";
    case 164: return "__NR_setresuid";
    case 165: return "__NR_getresuid";
    case 168: return "__NR_poll";
    case 169: return "__NR_nfsservctl";
    case 170: return "__NR_setresgid";
    case 171: return "__NR_getresgid";
    case 172: return "__NR_prctl";
    case 173: return "__NR_rt_sigreturn";
    case 174: return "__NR_rt_sigaction";
    case 175: return "__NR_rt_sigprocmask";
    case 176: return "__NR_rt_sigpending";
    case 177: return "__NR_rt_sigtimedwait";
    case 178: return "__NR_rt_sigqueueinfo";
    case 179: return "__NR_rt_sigsuspend";
    case 180: return "__NR_pread64";
    case 181: return "__NR_pwrite64";
    case 182: return "__NR_chown";
    case 183: return "__NR_getcwd";
    case 184: return "__NR_capget";
    case 185: return "__NR_capset";
    case 186: return "__NR_sigaltstack";
    case 187: return "__NR_sendfile";
    case 190: return "__NR_vfork";
    case 191: return "__NR_ugetrlimit";
    case 192: return "__NR_mmap2";
    case 193: return "__NR_truncate64";
    case 194: return "__NR_ftruncate64";
    case 195: return "__NR_stat64";
    case 196: return "__NR_lstat64";
    case 197: return "__NR_fstat64";
    case 198: return "__NR_lchown32";
    case 199: return "__NR_getuid32";
    case 200: return "__NR_getgid32";
    case 201: return "__NR_geteuid32";
    case 202: return "__NR_getegid32";
    case 203: return "__NR_setreuid32";
    case 204: return "__NR_setregid32";
    case 205: return "__NR_getgroups32";
    case 206: return "__NR_setgroups32";
    case 207: return "__NR_fchown32";
    case 208: return "__NR_setresuid32";
    case 209: return "__NR_getresuid32";
    case 210: return "__NR_setresgid32";
    case 211: return "__NR_getresgid32";
    case 212: return "__NR_chown32";
    case 213: return "__NR_setuid32";
    case 214: return "__NR_setgid32";
    case 215: return "__NR_setfsuid32";
    case 216: return "__NR_setfsgid32";
    case 217: return "__NR_getdents64";
    case 218: return "__NR_pivot_root";
    case 219: return "__NR_mincore";
    case 220: return "__NR_madvise";
    case 221: return "__NR_fcntl64";
    case 224: return "__NR_gettid";
    case 225: return "__NR_readahead";
    case 226: return "__NR_setxattr";
    case 227: return "__NR_lsetxattr";
    case 228: return "__NR_fsetxattr";
    case 229: return "__NR_getxattr";
    case 230: return "__NR_lgetxattr";
    case 231: return "__NR_fgetxattr";
    case 232: return "__NR_listxattr";
    case 233: return "__NR_llistxattr";
    case 234: return "__NR_flistxattr";
    case 235: return "__NR_removexattr";
    case 236: return "__NR_lremovexattr";
    case 237: return "__NR_fremovexattr";
    case 238: return "__NR_tkill";
    case 239: return "__NR_sendfile64";
    case 240: return "__NR_futex";
    case 241: return "__NR_sched_setaffinity";
    case 242: return "__NR_sched_getaffinity";
    case 243: return "__NR_io_setup";
    case 244: return "__NR_io_destroy";
    case 245: return "__NR_io_getevents";
    case 246: return "__NR_io_submit";
    case 247: return "__NR_io_cancel";
    case 248: return "__NR_exit_group";
    case 249: return "__NR_lookup_dcookie";
    case 250: return "__NR_epoll_create";
    case 251: return "__NR_epoll_ctl";
    case 252: return "__NR_epoll_wait";
    case 253: return "__NR_remap_file_pages";
    case 256: return "__NR_set_tid_address";
    case 257: return "__NR_timer_create";
    case 258: return "__NR_timer_settime";
    case 259: return "__NR_timer_gettime";
    case 260: return "__NR_timer_getoverrun";
    case 261: return "__NR_timer_delete";
    case 262: return "__NR_clock_settime";
    case 263: return "__NR_clock_gettime";
    case 264: return "__NR_clock_getres";
    case 265: return "__NR_clock_nanosleep";
    case 266: return "__NR_statfs64";
    case 267: return "__NR_fstatfs64";
    case 268: return "__NR_tgkill";
    case 269: return "__NR_utimes";
    case 270: return "__NR_arm_fadvise64_64";
    case 271: return "__NR_pciconfig_iobase";
    case 272: return "__NR_pciconfig_read";
    case 273: return "__NR_pciconfig_write";
    case 274: return "__NR_mq_open";
    case 275: return "__NR_mq_unlink";
    case 276: return "__NR_mq_timedsend";
    case 277: return "__NR_mq_timedreceive";
    case 278: return "__NR_mq_notify";
    case 279: return "__NR_mq_getsetattr";
    case 280: return "__NR_waitid";
    case 281: return "__NR_socket";
    case 282: return "__NR_bind";
    case 283: return "__NR_connect";
    case 284: return "__NR_listen";
    case 285: return "__NR_accept";
    case 286: return "__NR_getsockname";
    case 287: return "__NR_getpeername";
    case 288: return "__NR_socketpair";
    case 289: return "__NR_send";
    case 290: return "__NR_sendto";
    case 291: return "__NR_recv";
    case 292: return "__NR_recvfrom";
    case 293: return "__NR_shutdown";
    case 294: return "__NR_setsockopt";
    case 295: return "__NR_getsockopt";
    case 296: return "__NR_sendmsg";
    case 297: return "__NR_recvmsg";
    case 298: return "__NR_semop";
    case 299: return "__NR_semget";
    case 300: return "__NR_semctl";
    case 301: return "__NR_msgsnd";
    case 302: return "__NR_msgrcv";
    case 303: return "__NR_msgget";
    case 304: return "__NR_msgctl";
    case 305: return "__NR_shmat";
    case 306: return "__NR_shmdt";
    case 307: return "__NR_shmget";
    case 308: return "__NR_shmctl";
    case 309: return "__NR_add_key";
    case 310: return "__NR_request_key";
    case 311: return "__NR_keyctl";
    case 312: return "__NR_semtimedop";
    case 313: return "__NR_vserver";
    case 314: return "__NR_ioprio_set";
    case 315: return "__NR_ioprio_get";
    case 316: return "__NR_inotify_init";
    case 317: return "__NR_inotify_add_watch";
    case 318: return "__NR_inotify_rm_watch";
    case 319: return "__NR_mbind";
    case 320: return "__NR_get_mempolicy";
    case 321: return "__NR_set_mempolicy";
    case 322: return "__NR_openat";
    case 323: return "__NR_mkdirat";
    case 324: return "__NR_mknodat";
    case 325: return "__NR_fchownat";
    case 326: return "__NR_futimesat";
    case 327: return "__NR_fstatat64";
    case 328: return "__NR_unlinkat";
    case 329: return "__NR_renameat";
    case 330: return "__NR_linkat";
    case 331: return "__NR_symlinkat";
    case 332: return "__NR_readlinkat";
    case 333: return "__NR_fchmodat";
    case 334: return "__NR_faccessat";
    case 335: return "__NR_pselect6";
    case 336: return "__NR_ppoll";
    case 337: return "__NR_unshare";
    case 338: return "__NR_set_robust_list";
    case 339: return "__NR_get_robust_list";
    case 340: return "__NR_splice";
    case 341: return "__NR_arm_sync_file_range";
    case 342: return "__NR_tee";
    case 343: return "__NR_vmsplice";
    case 344: return "__NR_move_pages";
    case 345: return "__NR_getcpu";
    case 346: return "__NR_epoll_pwait";
    case 347: return "__NR_kexec_load";
    case 348: return "__NR_utimensat";
    case 349: return "__NR_signalfd";
    case 350: return "__NR_timerfd_create";
    case 351: return "__NR_eventfd";
    case 352: return "__NR_fallocate";
    case 353: return "__NR_timerfd_settime";
    case 354: return "__NR_timerfd_gettime";
    case 355: return "__NR_signalfd4";
    case 356: return "__NR_eventfd2";
    case 357: return "__NR_epoll_create1";
    case 358: return "__NR_dup3";
    case 359: return "__NR_pipe2";
    case 360: return "__NR_inotify_init1";
    case 361: return "__NR_preadv";
    case 362: return "__NR_pwritev";
    case 363: return "__NR_rt_tgsigqueueinfo";
    case 364: return "__NR_perf_event_open";
    case 365: return "__NR_recvmmsg";
    case 366: return "__NR_accept4";
    case 367: return "__NR_fanotify_init";
    case 368: return "__NR_fanotify_mark";
    case 369: return "__NR_prlimit64";
    case 370: return "__NR_name_to_handle_at";
    case 371: return "__NR_open_by_handle_at";
    case 372: return "__NR_clock_adjtime";
    case 373: return "__NR_syncfs";
    case 374: return "__NR_sendmmsg";
    case 375: return "__NR_setns";
    case 376: return "__NR_process_vm_readv";
    case 377: return "__NR_process_vm_writev";
    case 378: return "__NR_kcmp";
    case 379: return "__NR_finit_module";
    case 380: return "__NR_sched_setattr";
    case 381: return "__NR_sched_getattr";
    case 0xf0001: return "__ARM_NR_breakpoint";
    case 0xf0002: return "__ARM_NR_cacheflush";
    case 0xf0003: return "__ARM_NR_usr26";
    case 0xf0004: return "__ARM_NR_usr32";
    case 0xf0005: return "__ARM_NR_set_tls";
    default:
      break;
  }
  return base::StringPrintf("%d???", arm_sysno);
}

#if defined(__i386__)
std::string GetX86SyscallStr(int sysno) {
  // Based on android/bionic/libc/kernel/uapi/asm-x86/asm/unistd_32.h.
  std::string result;
  switch (sysno) {
    CASE_ASSIGN_ENUM_STR(__NR_restart_syscall, result);
    CASE_ASSIGN_ENUM_STR(__NR_exit, result);
    CASE_ASSIGN_ENUM_STR(__NR_fork, result);
    CASE_ASSIGN_ENUM_STR(__NR_read, result);
    CASE_ASSIGN_ENUM_STR(__NR_write, result);
    CASE_ASSIGN_ENUM_STR(__NR_open, result);
    CASE_ASSIGN_ENUM_STR(__NR_close, result);
    CASE_ASSIGN_ENUM_STR(__NR_waitpid, result);
    CASE_ASSIGN_ENUM_STR(__NR_creat, result);
    CASE_ASSIGN_ENUM_STR(__NR_link, result);
    CASE_ASSIGN_ENUM_STR(__NR_unlink, result);
    CASE_ASSIGN_ENUM_STR(__NR_execve, result);
    CASE_ASSIGN_ENUM_STR(__NR_chdir, result);
    CASE_ASSIGN_ENUM_STR(__NR_time, result);
    CASE_ASSIGN_ENUM_STR(__NR_mknod, result);
    CASE_ASSIGN_ENUM_STR(__NR_chmod, result);
    CASE_ASSIGN_ENUM_STR(__NR_lchown, result);
    CASE_ASSIGN_ENUM_STR(__NR_break, result);
    CASE_ASSIGN_ENUM_STR(__NR_oldstat, result);
    CASE_ASSIGN_ENUM_STR(__NR_lseek, result);
    CASE_ASSIGN_ENUM_STR(__NR_getpid, result);
    CASE_ASSIGN_ENUM_STR(__NR_mount, result);
    CASE_ASSIGN_ENUM_STR(__NR_umount, result);
    CASE_ASSIGN_ENUM_STR(__NR_setuid, result);
    CASE_ASSIGN_ENUM_STR(__NR_getuid, result);
    CASE_ASSIGN_ENUM_STR(__NR_stime, result);
    CASE_ASSIGN_ENUM_STR(__NR_ptrace, result);
    CASE_ASSIGN_ENUM_STR(__NR_alarm, result);
    CASE_ASSIGN_ENUM_STR(__NR_oldfstat, result);
    CASE_ASSIGN_ENUM_STR(__NR_pause, result);
    CASE_ASSIGN_ENUM_STR(__NR_utime, result);
    CASE_ASSIGN_ENUM_STR(__NR_stty, result);
    CASE_ASSIGN_ENUM_STR(__NR_gtty, result);
    CASE_ASSIGN_ENUM_STR(__NR_access, result);
    CASE_ASSIGN_ENUM_STR(__NR_nice, result);
    CASE_ASSIGN_ENUM_STR(__NR_ftime, result);
    CASE_ASSIGN_ENUM_STR(__NR_sync, result);
    CASE_ASSIGN_ENUM_STR(__NR_kill, result);
    CASE_ASSIGN_ENUM_STR(__NR_rename, result);
    CASE_ASSIGN_ENUM_STR(__NR_mkdir, result);
    CASE_ASSIGN_ENUM_STR(__NR_rmdir, result);
    CASE_ASSIGN_ENUM_STR(__NR_dup, result);
    CASE_ASSIGN_ENUM_STR(__NR_pipe, result);
    CASE_ASSIGN_ENUM_STR(__NR_times, result);
    CASE_ASSIGN_ENUM_STR(__NR_prof, result);
    CASE_ASSIGN_ENUM_STR(__NR_brk, result);
    CASE_ASSIGN_ENUM_STR(__NR_setgid, result);
    CASE_ASSIGN_ENUM_STR(__NR_getgid, result);
    CASE_ASSIGN_ENUM_STR(__NR_signal, result);
    CASE_ASSIGN_ENUM_STR(__NR_geteuid, result);
    CASE_ASSIGN_ENUM_STR(__NR_getegid, result);
    CASE_ASSIGN_ENUM_STR(__NR_acct, result);
    CASE_ASSIGN_ENUM_STR(__NR_umount2, result);
    CASE_ASSIGN_ENUM_STR(__NR_lock, result);
    CASE_ASSIGN_ENUM_STR(__NR_ioctl, result);
    CASE_ASSIGN_ENUM_STR(__NR_fcntl, result);
    CASE_ASSIGN_ENUM_STR(__NR_mpx, result);
    CASE_ASSIGN_ENUM_STR(__NR_setpgid, result);
    CASE_ASSIGN_ENUM_STR(__NR_ulimit, result);
    CASE_ASSIGN_ENUM_STR(__NR_oldolduname, result);
    CASE_ASSIGN_ENUM_STR(__NR_umask, result);
    CASE_ASSIGN_ENUM_STR(__NR_chroot, result);
    CASE_ASSIGN_ENUM_STR(__NR_ustat, result);
    CASE_ASSIGN_ENUM_STR(__NR_dup2, result);
    CASE_ASSIGN_ENUM_STR(__NR_getppid, result);
    CASE_ASSIGN_ENUM_STR(__NR_getpgrp, result);
    CASE_ASSIGN_ENUM_STR(__NR_setsid, result);
    CASE_ASSIGN_ENUM_STR(__NR_sigaction, result);
    CASE_ASSIGN_ENUM_STR(__NR_sgetmask, result);
    CASE_ASSIGN_ENUM_STR(__NR_ssetmask, result);
    CASE_ASSIGN_ENUM_STR(__NR_setreuid, result);
    CASE_ASSIGN_ENUM_STR(__NR_setregid, result);
    CASE_ASSIGN_ENUM_STR(__NR_sigsuspend, result);
    CASE_ASSIGN_ENUM_STR(__NR_sigpending, result);
    CASE_ASSIGN_ENUM_STR(__NR_sethostname, result);
    CASE_ASSIGN_ENUM_STR(__NR_setrlimit, result);
    CASE_ASSIGN_ENUM_STR(__NR_getrlimit, result);
    CASE_ASSIGN_ENUM_STR(__NR_getrusage, result);
    CASE_ASSIGN_ENUM_STR(__NR_gettimeofday, result);
    CASE_ASSIGN_ENUM_STR(__NR_settimeofday, result);
    CASE_ASSIGN_ENUM_STR(__NR_getgroups, result);
    CASE_ASSIGN_ENUM_STR(__NR_setgroups, result);
    CASE_ASSIGN_ENUM_STR(__NR_select, result);
    CASE_ASSIGN_ENUM_STR(__NR_symlink, result);
    CASE_ASSIGN_ENUM_STR(__NR_oldlstat, result);
    CASE_ASSIGN_ENUM_STR(__NR_readlink, result);
    CASE_ASSIGN_ENUM_STR(__NR_uselib, result);
    CASE_ASSIGN_ENUM_STR(__NR_swapon, result);
    CASE_ASSIGN_ENUM_STR(__NR_reboot, result);
    CASE_ASSIGN_ENUM_STR(__NR_readdir, result);
    CASE_ASSIGN_ENUM_STR(__NR_mmap, result);
    CASE_ASSIGN_ENUM_STR(__NR_munmap, result);
    CASE_ASSIGN_ENUM_STR(__NR_truncate, result);
    CASE_ASSIGN_ENUM_STR(__NR_ftruncate, result);
    CASE_ASSIGN_ENUM_STR(__NR_fchmod, result);
    CASE_ASSIGN_ENUM_STR(__NR_fchown, result);
    CASE_ASSIGN_ENUM_STR(__NR_getpriority, result);
    CASE_ASSIGN_ENUM_STR(__NR_setpriority, result);
    CASE_ASSIGN_ENUM_STR(__NR_profil, result);
    CASE_ASSIGN_ENUM_STR(__NR_statfs, result);
    CASE_ASSIGN_ENUM_STR(__NR_fstatfs, result);
    CASE_ASSIGN_ENUM_STR(__NR_ioperm, result);
    CASE_ASSIGN_ENUM_STR(__NR_socketcall, result);
    CASE_ASSIGN_ENUM_STR(__NR_syslog, result);
    CASE_ASSIGN_ENUM_STR(__NR_setitimer, result);
    CASE_ASSIGN_ENUM_STR(__NR_getitimer, result);
    CASE_ASSIGN_ENUM_STR(__NR_stat, result);
    CASE_ASSIGN_ENUM_STR(__NR_lstat, result);
    CASE_ASSIGN_ENUM_STR(__NR_fstat, result);
    CASE_ASSIGN_ENUM_STR(__NR_olduname, result);
    CASE_ASSIGN_ENUM_STR(__NR_iopl, result);
    CASE_ASSIGN_ENUM_STR(__NR_vhangup, result);
    CASE_ASSIGN_ENUM_STR(__NR_idle, result);
    CASE_ASSIGN_ENUM_STR(__NR_vm86old, result);
    CASE_ASSIGN_ENUM_STR(__NR_wait4, result);
    CASE_ASSIGN_ENUM_STR(__NR_swapoff, result);
    CASE_ASSIGN_ENUM_STR(__NR_sysinfo, result);
    CASE_ASSIGN_ENUM_STR(__NR_ipc, result);
    CASE_ASSIGN_ENUM_STR(__NR_fsync, result);
    CASE_ASSIGN_ENUM_STR(__NR_sigreturn, result);
    CASE_ASSIGN_ENUM_STR(__NR_clone, result);
    CASE_ASSIGN_ENUM_STR(__NR_setdomainname, result);
    CASE_ASSIGN_ENUM_STR(__NR_uname, result);
    CASE_ASSIGN_ENUM_STR(__NR_modify_ldt, result);
    CASE_ASSIGN_ENUM_STR(__NR_adjtimex, result);
    CASE_ASSIGN_ENUM_STR(__NR_mprotect, result);
    CASE_ASSIGN_ENUM_STR(__NR_sigprocmask, result);
    CASE_ASSIGN_ENUM_STR(__NR_create_module, result);
    CASE_ASSIGN_ENUM_STR(__NR_init_module, result);
    CASE_ASSIGN_ENUM_STR(__NR_delete_module, result);
    CASE_ASSIGN_ENUM_STR(__NR_get_kernel_syms, result);
    CASE_ASSIGN_ENUM_STR(__NR_quotactl, result);
    CASE_ASSIGN_ENUM_STR(__NR_getpgid, result);
    CASE_ASSIGN_ENUM_STR(__NR_fchdir, result);
    CASE_ASSIGN_ENUM_STR(__NR_bdflush, result);
    CASE_ASSIGN_ENUM_STR(__NR_sysfs, result);
    CASE_ASSIGN_ENUM_STR(__NR_personality, result);
    CASE_ASSIGN_ENUM_STR(__NR_afs_syscall, result);
    CASE_ASSIGN_ENUM_STR(__NR_setfsuid, result);
    CASE_ASSIGN_ENUM_STR(__NR_setfsgid, result);
    CASE_ASSIGN_ENUM_STR(__NR__llseek, result);
    CASE_ASSIGN_ENUM_STR(__NR_getdents, result);
    CASE_ASSIGN_ENUM_STR(__NR__newselect, result);
    CASE_ASSIGN_ENUM_STR(__NR_flock, result);
    CASE_ASSIGN_ENUM_STR(__NR_msync, result);
    CASE_ASSIGN_ENUM_STR(__NR_readv, result);
    CASE_ASSIGN_ENUM_STR(__NR_writev, result);
    CASE_ASSIGN_ENUM_STR(__NR_getsid, result);
    CASE_ASSIGN_ENUM_STR(__NR_fdatasync, result);
    CASE_ASSIGN_ENUM_STR(__NR__sysctl, result);
    CASE_ASSIGN_ENUM_STR(__NR_mlock, result);
    CASE_ASSIGN_ENUM_STR(__NR_munlock, result);
    CASE_ASSIGN_ENUM_STR(__NR_mlockall, result);
    CASE_ASSIGN_ENUM_STR(__NR_munlockall, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_setparam, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_getparam, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_setscheduler, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_getscheduler, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_yield, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_get_priority_max, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_get_priority_min, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_rr_get_interval, result);
    CASE_ASSIGN_ENUM_STR(__NR_nanosleep, result);
    CASE_ASSIGN_ENUM_STR(__NR_mremap, result);
    CASE_ASSIGN_ENUM_STR(__NR_setresuid, result);
    CASE_ASSIGN_ENUM_STR(__NR_getresuid, result);
    CASE_ASSIGN_ENUM_STR(__NR_vm86, result);
    CASE_ASSIGN_ENUM_STR(__NR_query_module, result);
    CASE_ASSIGN_ENUM_STR(__NR_poll, result);
    CASE_ASSIGN_ENUM_STR(__NR_nfsservctl, result);
    CASE_ASSIGN_ENUM_STR(__NR_setresgid, result);
    CASE_ASSIGN_ENUM_STR(__NR_getresgid, result);
    CASE_ASSIGN_ENUM_STR(__NR_prctl, result);
    CASE_ASSIGN_ENUM_STR(__NR_rt_sigreturn, result);
    CASE_ASSIGN_ENUM_STR(__NR_rt_sigaction, result);
    CASE_ASSIGN_ENUM_STR(__NR_rt_sigprocmask, result);
    CASE_ASSIGN_ENUM_STR(__NR_rt_sigpending, result);
    CASE_ASSIGN_ENUM_STR(__NR_rt_sigtimedwait, result);
    CASE_ASSIGN_ENUM_STR(__NR_rt_sigqueueinfo, result);
    CASE_ASSIGN_ENUM_STR(__NR_rt_sigsuspend, result);
    CASE_ASSIGN_ENUM_STR(__NR_pread64, result);
    CASE_ASSIGN_ENUM_STR(__NR_pwrite64, result);
    CASE_ASSIGN_ENUM_STR(__NR_chown, result);
    CASE_ASSIGN_ENUM_STR(__NR_getcwd, result);
    CASE_ASSIGN_ENUM_STR(__NR_capget, result);
    CASE_ASSIGN_ENUM_STR(__NR_capset, result);
    CASE_ASSIGN_ENUM_STR(__NR_sigaltstack, result);
    CASE_ASSIGN_ENUM_STR(__NR_sendfile, result);
    CASE_ASSIGN_ENUM_STR(__NR_getpmsg, result);
    CASE_ASSIGN_ENUM_STR(__NR_putpmsg, result);
    CASE_ASSIGN_ENUM_STR(__NR_vfork, result);
    CASE_ASSIGN_ENUM_STR(__NR_ugetrlimit, result);
    CASE_ASSIGN_ENUM_STR(__NR_mmap2, result);
    CASE_ASSIGN_ENUM_STR(__NR_truncate64, result);
    CASE_ASSIGN_ENUM_STR(__NR_ftruncate64, result);
    CASE_ASSIGN_ENUM_STR(__NR_stat64, result);
    CASE_ASSIGN_ENUM_STR(__NR_lstat64, result);
    CASE_ASSIGN_ENUM_STR(__NR_fstat64, result);
    CASE_ASSIGN_ENUM_STR(__NR_lchown32, result);
    CASE_ASSIGN_ENUM_STR(__NR_getuid32, result);
    CASE_ASSIGN_ENUM_STR(__NR_getgid32, result);
    CASE_ASSIGN_ENUM_STR(__NR_geteuid32, result);
    CASE_ASSIGN_ENUM_STR(__NR_getegid32, result);
    CASE_ASSIGN_ENUM_STR(__NR_setreuid32, result);
    CASE_ASSIGN_ENUM_STR(__NR_setregid32, result);
    CASE_ASSIGN_ENUM_STR(__NR_getgroups32, result);
    CASE_ASSIGN_ENUM_STR(__NR_setgroups32, result);
    CASE_ASSIGN_ENUM_STR(__NR_fchown32, result);
    CASE_ASSIGN_ENUM_STR(__NR_setresuid32, result);
    CASE_ASSIGN_ENUM_STR(__NR_getresuid32, result);
    CASE_ASSIGN_ENUM_STR(__NR_setresgid32, result);
    CASE_ASSIGN_ENUM_STR(__NR_getresgid32, result);
    CASE_ASSIGN_ENUM_STR(__NR_chown32, result);
    CASE_ASSIGN_ENUM_STR(__NR_setuid32, result);
    CASE_ASSIGN_ENUM_STR(__NR_setgid32, result);
    CASE_ASSIGN_ENUM_STR(__NR_setfsuid32, result);
    CASE_ASSIGN_ENUM_STR(__NR_setfsgid32, result);
    CASE_ASSIGN_ENUM_STR(__NR_pivot_root, result);
    CASE_ASSIGN_ENUM_STR(__NR_mincore, result);
    CASE_ASSIGN_ENUM_STR(__NR_madvise, result);
    CASE_ASSIGN_ENUM_STR(__NR_getdents64, result);
    CASE_ASSIGN_ENUM_STR(__NR_fcntl64, result);
    CASE_ASSIGN_ENUM_STR(__NR_gettid, result);
    CASE_ASSIGN_ENUM_STR(__NR_readahead, result);
    CASE_ASSIGN_ENUM_STR(__NR_setxattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_lsetxattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_fsetxattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_getxattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_lgetxattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_fgetxattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_listxattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_llistxattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_flistxattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_removexattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_lremovexattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_fremovexattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_tkill, result);
    CASE_ASSIGN_ENUM_STR(__NR_sendfile64, result);
    CASE_ASSIGN_ENUM_STR(__NR_futex, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_setaffinity, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_getaffinity, result);
    CASE_ASSIGN_ENUM_STR(__NR_set_thread_area, result);
    CASE_ASSIGN_ENUM_STR(__NR_get_thread_area, result);
    CASE_ASSIGN_ENUM_STR(__NR_io_setup, result);
    CASE_ASSIGN_ENUM_STR(__NR_io_destroy, result);
    CASE_ASSIGN_ENUM_STR(__NR_io_getevents, result);
    CASE_ASSIGN_ENUM_STR(__NR_io_submit, result);
    CASE_ASSIGN_ENUM_STR(__NR_io_cancel, result);
    CASE_ASSIGN_ENUM_STR(__NR_fadvise64, result);
    CASE_ASSIGN_ENUM_STR(__NR_exit_group, result);
    CASE_ASSIGN_ENUM_STR(__NR_lookup_dcookie, result);
    CASE_ASSIGN_ENUM_STR(__NR_epoll_create, result);
    CASE_ASSIGN_ENUM_STR(__NR_epoll_ctl, result);
    CASE_ASSIGN_ENUM_STR(__NR_epoll_wait, result);
    CASE_ASSIGN_ENUM_STR(__NR_remap_file_pages, result);
    CASE_ASSIGN_ENUM_STR(__NR_set_tid_address, result);
    CASE_ASSIGN_ENUM_STR(__NR_timer_create, result);
    CASE_ASSIGN_ENUM_STR(__NR_timer_settime, result);
    CASE_ASSIGN_ENUM_STR(__NR_timer_gettime, result);
    CASE_ASSIGN_ENUM_STR(__NR_timer_getoverrun, result);
    CASE_ASSIGN_ENUM_STR(__NR_timer_delete, result);
    CASE_ASSIGN_ENUM_STR(__NR_clock_settime, result);
    CASE_ASSIGN_ENUM_STR(__NR_clock_gettime, result);
    CASE_ASSIGN_ENUM_STR(__NR_clock_getres, result);
    CASE_ASSIGN_ENUM_STR(__NR_clock_nanosleep, result);
    CASE_ASSIGN_ENUM_STR(__NR_statfs64, result);
    CASE_ASSIGN_ENUM_STR(__NR_fstatfs64, result);
    CASE_ASSIGN_ENUM_STR(__NR_tgkill, result);
    CASE_ASSIGN_ENUM_STR(__NR_utimes, result);
    CASE_ASSIGN_ENUM_STR(__NR_fadvise64_64, result);
    CASE_ASSIGN_ENUM_STR(__NR_vserver, result);
    CASE_ASSIGN_ENUM_STR(__NR_mbind, result);
    CASE_ASSIGN_ENUM_STR(__NR_get_mempolicy, result);
    CASE_ASSIGN_ENUM_STR(__NR_set_mempolicy, result);
    CASE_ASSIGN_ENUM_STR(__NR_mq_open, result);
    CASE_ASSIGN_ENUM_STR(__NR_mq_unlink, result);
    CASE_ASSIGN_ENUM_STR(__NR_mq_timedsend, result);
    CASE_ASSIGN_ENUM_STR(__NR_mq_timedreceive, result);
    CASE_ASSIGN_ENUM_STR(__NR_mq_notify, result);
    CASE_ASSIGN_ENUM_STR(__NR_mq_getsetattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_kexec_load, result);
    CASE_ASSIGN_ENUM_STR(__NR_waitid, result);
    CASE_ASSIGN_ENUM_STR(__NR_add_key, result);
    CASE_ASSIGN_ENUM_STR(__NR_request_key, result);
    CASE_ASSIGN_ENUM_STR(__NR_keyctl, result);
    CASE_ASSIGN_ENUM_STR(__NR_ioprio_set, result);
    CASE_ASSIGN_ENUM_STR(__NR_ioprio_get, result);
    CASE_ASSIGN_ENUM_STR(__NR_inotify_init, result);
    CASE_ASSIGN_ENUM_STR(__NR_inotify_add_watch, result);
    CASE_ASSIGN_ENUM_STR(__NR_inotify_rm_watch, result);
    CASE_ASSIGN_ENUM_STR(__NR_migrate_pages, result);
    CASE_ASSIGN_ENUM_STR(__NR_openat, result);
    CASE_ASSIGN_ENUM_STR(__NR_mkdirat, result);
    CASE_ASSIGN_ENUM_STR(__NR_mknodat, result);
    CASE_ASSIGN_ENUM_STR(__NR_fchownat, result);
    CASE_ASSIGN_ENUM_STR(__NR_futimesat, result);
    CASE_ASSIGN_ENUM_STR(__NR_fstatat64, result);
    CASE_ASSIGN_ENUM_STR(__NR_unlinkat, result);
    CASE_ASSIGN_ENUM_STR(__NR_renameat, result);
    CASE_ASSIGN_ENUM_STR(__NR_linkat, result);
    CASE_ASSIGN_ENUM_STR(__NR_symlinkat, result);
    CASE_ASSIGN_ENUM_STR(__NR_readlinkat, result);
    CASE_ASSIGN_ENUM_STR(__NR_fchmodat, result);
    CASE_ASSIGN_ENUM_STR(__NR_faccessat, result);
    CASE_ASSIGN_ENUM_STR(__NR_pselect6, result);
    CASE_ASSIGN_ENUM_STR(__NR_ppoll, result);
    CASE_ASSIGN_ENUM_STR(__NR_unshare, result);
    CASE_ASSIGN_ENUM_STR(__NR_set_robust_list, result);
    CASE_ASSIGN_ENUM_STR(__NR_get_robust_list, result);
    CASE_ASSIGN_ENUM_STR(__NR_splice, result);
    CASE_ASSIGN_ENUM_STR(__NR_sync_file_range, result);
    CASE_ASSIGN_ENUM_STR(__NR_tee, result);
    CASE_ASSIGN_ENUM_STR(__NR_vmsplice, result);
    CASE_ASSIGN_ENUM_STR(__NR_move_pages, result);
    CASE_ASSIGN_ENUM_STR(__NR_getcpu, result);
    CASE_ASSIGN_ENUM_STR(__NR_epoll_pwait, result);
    CASE_ASSIGN_ENUM_STR(__NR_utimensat, result);
    CASE_ASSIGN_ENUM_STR(__NR_signalfd, result);
    CASE_ASSIGN_ENUM_STR(__NR_timerfd_create, result);
    CASE_ASSIGN_ENUM_STR(__NR_eventfd, result);
    CASE_ASSIGN_ENUM_STR(__NR_fallocate, result);
    CASE_ASSIGN_ENUM_STR(__NR_timerfd_settime, result);
    CASE_ASSIGN_ENUM_STR(__NR_timerfd_gettime, result);
    CASE_ASSIGN_ENUM_STR(__NR_signalfd4, result);
    CASE_ASSIGN_ENUM_STR(__NR_eventfd2, result);
    CASE_ASSIGN_ENUM_STR(__NR_epoll_create1, result);
    CASE_ASSIGN_ENUM_STR(__NR_dup3, result);
    CASE_ASSIGN_ENUM_STR(__NR_pipe2, result);
    CASE_ASSIGN_ENUM_STR(__NR_inotify_init1, result);
    CASE_ASSIGN_ENUM_STR(__NR_preadv, result);
    CASE_ASSIGN_ENUM_STR(__NR_pwritev, result);
    CASE_ASSIGN_ENUM_STR(__NR_rt_tgsigqueueinfo, result);
    CASE_ASSIGN_ENUM_STR(__NR_perf_event_open, result);
    CASE_ASSIGN_ENUM_STR(__NR_recvmmsg, result);
    CASE_ASSIGN_ENUM_STR(__NR_fanotify_init, result);
    CASE_ASSIGN_ENUM_STR(__NR_fanotify_mark, result);
    CASE_ASSIGN_ENUM_STR(__NR_prlimit64, result);
    CASE_ASSIGN_ENUM_STR(__NR_name_to_handle_at, result);
    CASE_ASSIGN_ENUM_STR(__NR_open_by_handle_at, result);
    CASE_ASSIGN_ENUM_STR(__NR_clock_adjtime, result);
    CASE_ASSIGN_ENUM_STR(__NR_syncfs, result);
    CASE_ASSIGN_ENUM_STR(__NR_sendmmsg, result);
    CASE_ASSIGN_ENUM_STR(__NR_setns, result);
    CASE_ASSIGN_ENUM_STR(__NR_process_vm_readv, result);
    CASE_ASSIGN_ENUM_STR(__NR_process_vm_writev, result);
    CASE_ASSIGN_ENUM_STR(__NR_kcmp, result);
    CASE_ASSIGN_ENUM_STR(__NR_finit_module, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_setattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_getattr, result);
    default:
      result = base::StringPrintf("%d???", sysno);
      break;
  }
  return result;
}
#elif defined(__ILP32__) && !defined(__arm__)
std::string GetX86SyscallStr(int sysno) {
  // Based on android/bionic/libc/kernel/uapi/asm-x86/asm/unistd_x32.h.
  std::string result;
  switch (sysno) {
    CASE_ASSIGN_ENUM_STR(__NR_read, result);
    CASE_ASSIGN_ENUM_STR(__NR_write, result);
    CASE_ASSIGN_ENUM_STR(__NR_open, result);
    CASE_ASSIGN_ENUM_STR(__NR_close, result);
    CASE_ASSIGN_ENUM_STR(__NR_stat, result);
    CASE_ASSIGN_ENUM_STR(__NR_fstat, result);
    CASE_ASSIGN_ENUM_STR(__NR_lstat, result);
    CASE_ASSIGN_ENUM_STR(__NR_poll, result);
    CASE_ASSIGN_ENUM_STR(__NR_lseek, result);
    CASE_ASSIGN_ENUM_STR(__NR_mmap, result);
    CASE_ASSIGN_ENUM_STR(__NR_mprotect, result);
    CASE_ASSIGN_ENUM_STR(__NR_munmap, result);
    CASE_ASSIGN_ENUM_STR(__NR_brk, result);
    CASE_ASSIGN_ENUM_STR(__NR_rt_sigprocmask, result);
    CASE_ASSIGN_ENUM_STR(__NR_pread64, result);
    CASE_ASSIGN_ENUM_STR(__NR_pwrite64, result);
    CASE_ASSIGN_ENUM_STR(__NR_access, result);
    CASE_ASSIGN_ENUM_STR(__NR_pipe, result);
    CASE_ASSIGN_ENUM_STR(__NR_select, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_yield, result);
    CASE_ASSIGN_ENUM_STR(__NR_mremap, result);
    CASE_ASSIGN_ENUM_STR(__NR_msync, result);
    CASE_ASSIGN_ENUM_STR(__NR_mincore, result);
    CASE_ASSIGN_ENUM_STR(__NR_madvise, result);
    CASE_ASSIGN_ENUM_STR(__NR_shmget, result);
    CASE_ASSIGN_ENUM_STR(__NR_shmat, result);
    CASE_ASSIGN_ENUM_STR(__NR_shmctl, result);
    CASE_ASSIGN_ENUM_STR(__NR_dup, result);
    CASE_ASSIGN_ENUM_STR(__NR_dup2, result);
    CASE_ASSIGN_ENUM_STR(__NR_pause, result);
    CASE_ASSIGN_ENUM_STR(__NR_nanosleep, result);
    CASE_ASSIGN_ENUM_STR(__NR_getitimer, result);
    CASE_ASSIGN_ENUM_STR(__NR_alarm, result);
    CASE_ASSIGN_ENUM_STR(__NR_setitimer, result);
    CASE_ASSIGN_ENUM_STR(__NR_getpid, result);
    CASE_ASSIGN_ENUM_STR(__NR_sendfile, result);
    CASE_ASSIGN_ENUM_STR(__NR_socket, result);
    CASE_ASSIGN_ENUM_STR(__NR_connect, result);
    CASE_ASSIGN_ENUM_STR(__NR_accept, result);
    CASE_ASSIGN_ENUM_STR(__NR_sendto, result);
    CASE_ASSIGN_ENUM_STR(__NR_shutdown, result);
    CASE_ASSIGN_ENUM_STR(__NR_bind, result);
    CASE_ASSIGN_ENUM_STR(__NR_listen, result);
    CASE_ASSIGN_ENUM_STR(__NR_getsockname, result);
    CASE_ASSIGN_ENUM_STR(__NR_getpeername, result);
    CASE_ASSIGN_ENUM_STR(__NR_socketpair, result);
    CASE_ASSIGN_ENUM_STR(__NR_clone, result);
    CASE_ASSIGN_ENUM_STR(__NR_fork, result);
    CASE_ASSIGN_ENUM_STR(__NR_vfork, result);
    CASE_ASSIGN_ENUM_STR(__NR_exit, result);
    CASE_ASSIGN_ENUM_STR(__NR_wait4, result);
    CASE_ASSIGN_ENUM_STR(__NR_kill, result);
    CASE_ASSIGN_ENUM_STR(__NR_uname, result);
    CASE_ASSIGN_ENUM_STR(__NR_semget, result);
    CASE_ASSIGN_ENUM_STR(__NR_semop, result);
    CASE_ASSIGN_ENUM_STR(__NR_semctl, result);
    CASE_ASSIGN_ENUM_STR(__NR_shmdt, result);
    CASE_ASSIGN_ENUM_STR(__NR_msgget, result);
    CASE_ASSIGN_ENUM_STR(__NR_msgsnd, result);
    CASE_ASSIGN_ENUM_STR(__NR_msgrcv, result);
    CASE_ASSIGN_ENUM_STR(__NR_msgctl, result);
    CASE_ASSIGN_ENUM_STR(__NR_fcntl, result);
    CASE_ASSIGN_ENUM_STR(__NR_flock, result);
    CASE_ASSIGN_ENUM_STR(__NR_fsync, result);
    CASE_ASSIGN_ENUM_STR(__NR_fdatasync, result);
    CASE_ASSIGN_ENUM_STR(__NR_truncate, result);
    CASE_ASSIGN_ENUM_STR(__NR_ftruncate, result);
    CASE_ASSIGN_ENUM_STR(__NR_getdents, result);
    CASE_ASSIGN_ENUM_STR(__NR_getcwd, result);
    CASE_ASSIGN_ENUM_STR(__NR_chdir, result);
    CASE_ASSIGN_ENUM_STR(__NR_fchdir, result);
    CASE_ASSIGN_ENUM_STR(__NR_rename, result);
    CASE_ASSIGN_ENUM_STR(__NR_mkdir, result);
    CASE_ASSIGN_ENUM_STR(__NR_rmdir, result);
    CASE_ASSIGN_ENUM_STR(__NR_creat, result);
    CASE_ASSIGN_ENUM_STR(__NR_link, result);
    CASE_ASSIGN_ENUM_STR(__NR_unlink, result);
    CASE_ASSIGN_ENUM_STR(__NR_symlink, result);
    CASE_ASSIGN_ENUM_STR(__NR_readlink, result);
    CASE_ASSIGN_ENUM_STR(__NR_chmod, result);
    CASE_ASSIGN_ENUM_STR(__NR_fchmod, result);
    CASE_ASSIGN_ENUM_STR(__NR_chown, result);
    CASE_ASSIGN_ENUM_STR(__NR_fchown, result);
    CASE_ASSIGN_ENUM_STR(__NR_lchown, result);
    CASE_ASSIGN_ENUM_STR(__NR_umask, result);
    CASE_ASSIGN_ENUM_STR(__NR_gettimeofday, result);
    CASE_ASSIGN_ENUM_STR(__NR_getrlimit, result);
    CASE_ASSIGN_ENUM_STR(__NR_getrusage, result);
    CASE_ASSIGN_ENUM_STR(__NR_sysinfo, result);
    CASE_ASSIGN_ENUM_STR(__NR_times, result);
    CASE_ASSIGN_ENUM_STR(__NR_getuid, result);
    CASE_ASSIGN_ENUM_STR(__NR_syslog, result);
    CASE_ASSIGN_ENUM_STR(__NR_getgid, result);
    CASE_ASSIGN_ENUM_STR(__NR_setuid, result);
    CASE_ASSIGN_ENUM_STR(__NR_setgid, result);
    CASE_ASSIGN_ENUM_STR(__NR_geteuid, result);
    CASE_ASSIGN_ENUM_STR(__NR_getegid, result);
    CASE_ASSIGN_ENUM_STR(__NR_setpgid, result);
    CASE_ASSIGN_ENUM_STR(__NR_getppid, result);
    CASE_ASSIGN_ENUM_STR(__NR_getpgrp, result);
    CASE_ASSIGN_ENUM_STR(__NR_setsid, result);
    CASE_ASSIGN_ENUM_STR(__NR_setreuid, result);
    CASE_ASSIGN_ENUM_STR(__NR_setregid, result);
    CASE_ASSIGN_ENUM_STR(__NR_getgroups, result);
    CASE_ASSIGN_ENUM_STR(__NR_setgroups, result);
    CASE_ASSIGN_ENUM_STR(__NR_setresuid, result);
    CASE_ASSIGN_ENUM_STR(__NR_getresuid, result);
    CASE_ASSIGN_ENUM_STR(__NR_setresgid, result);
    CASE_ASSIGN_ENUM_STR(__NR_getresgid, result);
    CASE_ASSIGN_ENUM_STR(__NR_getpgid, result);
    CASE_ASSIGN_ENUM_STR(__NR_setfsuid, result);
    CASE_ASSIGN_ENUM_STR(__NR_setfsgid, result);
    CASE_ASSIGN_ENUM_STR(__NR_getsid, result);
    CASE_ASSIGN_ENUM_STR(__NR_capget, result);
    CASE_ASSIGN_ENUM_STR(__NR_capset, result);
    CASE_ASSIGN_ENUM_STR(__NR_rt_sigsuspend, result);
    CASE_ASSIGN_ENUM_STR(__NR_utime, result);
    CASE_ASSIGN_ENUM_STR(__NR_mknod, result);
    CASE_ASSIGN_ENUM_STR(__NR_personality, result);
    CASE_ASSIGN_ENUM_STR(__NR_ustat, result);
    CASE_ASSIGN_ENUM_STR(__NR_statfs, result);
    CASE_ASSIGN_ENUM_STR(__NR_fstatfs, result);
    CASE_ASSIGN_ENUM_STR(__NR_sysfs, result);
    CASE_ASSIGN_ENUM_STR(__NR_getpriority, result);
    CASE_ASSIGN_ENUM_STR(__NR_setpriority, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_setparam, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_getparam, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_setscheduler, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_getscheduler, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_get_priority_max, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_get_priority_min, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_rr_get_interval, result);
    CASE_ASSIGN_ENUM_STR(__NR_mlock, result);
    CASE_ASSIGN_ENUM_STR(__NR_munlock, result);
    CASE_ASSIGN_ENUM_STR(__NR_mlockall, result);
    CASE_ASSIGN_ENUM_STR(__NR_munlockall, result);
    CASE_ASSIGN_ENUM_STR(__NR_vhangup, result);
    CASE_ASSIGN_ENUM_STR(__NR_modify_ldt, result);
    CASE_ASSIGN_ENUM_STR(__NR_pivot_root, result);
    CASE_ASSIGN_ENUM_STR(__NR_prctl, result);
    CASE_ASSIGN_ENUM_STR(__NR_arch_prctl, result);
    CASE_ASSIGN_ENUM_STR(__NR_adjtimex, result);
    CASE_ASSIGN_ENUM_STR(__NR_setrlimit, result);
    CASE_ASSIGN_ENUM_STR(__NR_chroot, result);
    CASE_ASSIGN_ENUM_STR(__NR_sync, result);
    CASE_ASSIGN_ENUM_STR(__NR_acct, result);
    CASE_ASSIGN_ENUM_STR(__NR_settimeofday, result);
    CASE_ASSIGN_ENUM_STR(__NR_mount, result);
    CASE_ASSIGN_ENUM_STR(__NR_umount2, result);
    CASE_ASSIGN_ENUM_STR(__NR_swapon, result);
    CASE_ASSIGN_ENUM_STR(__NR_swapoff, result);
    CASE_ASSIGN_ENUM_STR(__NR_reboot, result);
    CASE_ASSIGN_ENUM_STR(__NR_sethostname, result);
    CASE_ASSIGN_ENUM_STR(__NR_setdomainname, result);
    CASE_ASSIGN_ENUM_STR(__NR_iopl, result);
    CASE_ASSIGN_ENUM_STR(__NR_ioperm, result);
    CASE_ASSIGN_ENUM_STR(__NR_init_module, result);
    CASE_ASSIGN_ENUM_STR(__NR_delete_module, result);
    CASE_ASSIGN_ENUM_STR(__NR_quotactl, result);
    CASE_ASSIGN_ENUM_STR(__NR_getpmsg, result);
    CASE_ASSIGN_ENUM_STR(__NR_putpmsg, result);
    CASE_ASSIGN_ENUM_STR(__NR_afs_syscall, result);
    CASE_ASSIGN_ENUM_STR(__NR_tuxcall, result);
    CASE_ASSIGN_ENUM_STR(__NR_security, result);
    CASE_ASSIGN_ENUM_STR(__NR_gettid, result);
    CASE_ASSIGN_ENUM_STR(__NR_readahead, result);
    CASE_ASSIGN_ENUM_STR(__NR_setxattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_lsetxattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_fsetxattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_getxattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_lgetxattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_fgetxattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_listxattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_llistxattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_flistxattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_removexattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_lremovexattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_fremovexattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_tkill, result);
    CASE_ASSIGN_ENUM_STR(__NR_time, result);
    CASE_ASSIGN_ENUM_STR(__NR_futex, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_setaffinity, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_getaffinity, result);
    CASE_ASSIGN_ENUM_STR(__NR_io_setup, result);
    CASE_ASSIGN_ENUM_STR(__NR_io_destroy, result);
    CASE_ASSIGN_ENUM_STR(__NR_io_getevents, result);
    CASE_ASSIGN_ENUM_STR(__NR_io_submit, result);
    CASE_ASSIGN_ENUM_STR(__NR_io_cancel, result);
    CASE_ASSIGN_ENUM_STR(__NR_lookup_dcookie, result);
    CASE_ASSIGN_ENUM_STR(__NR_epoll_create, result);
    CASE_ASSIGN_ENUM_STR(__NR_remap_file_pages, result);
    CASE_ASSIGN_ENUM_STR(__NR_getdents64, result);
    CASE_ASSIGN_ENUM_STR(__NR_set_tid_address, result);
    CASE_ASSIGN_ENUM_STR(__NR_restart_syscall, result);
    CASE_ASSIGN_ENUM_STR(__NR_semtimedop, result);
    CASE_ASSIGN_ENUM_STR(__NR_fadvise64, result);
    CASE_ASSIGN_ENUM_STR(__NR_timer_settime, result);
    CASE_ASSIGN_ENUM_STR(__NR_timer_gettime, result);
    CASE_ASSIGN_ENUM_STR(__NR_timer_getoverrun, result);
    CASE_ASSIGN_ENUM_STR(__NR_timer_delete, result);
    CASE_ASSIGN_ENUM_STR(__NR_clock_settime, result);
    CASE_ASSIGN_ENUM_STR(__NR_clock_gettime, result);
    CASE_ASSIGN_ENUM_STR(__NR_clock_getres, result);
    CASE_ASSIGN_ENUM_STR(__NR_clock_nanosleep, result);
    CASE_ASSIGN_ENUM_STR(__NR_exit_group, result);
    CASE_ASSIGN_ENUM_STR(__NR_epoll_wait, result);
    CASE_ASSIGN_ENUM_STR(__NR_epoll_ctl, result);
    CASE_ASSIGN_ENUM_STR(__NR_tgkill, result);
    CASE_ASSIGN_ENUM_STR(__NR_utimes, result);
    CASE_ASSIGN_ENUM_STR(__NR_mbind, result);
    CASE_ASSIGN_ENUM_STR(__NR_set_mempolicy, result);
    CASE_ASSIGN_ENUM_STR(__NR_get_mempolicy, result);
    CASE_ASSIGN_ENUM_STR(__NR_mq_open, result);
    CASE_ASSIGN_ENUM_STR(__NR_mq_unlink, result);
    CASE_ASSIGN_ENUM_STR(__NR_mq_timedsend, result);
    CASE_ASSIGN_ENUM_STR(__NR_mq_timedreceive, result);
    CASE_ASSIGN_ENUM_STR(__NR_mq_getsetattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_add_key, result);
    CASE_ASSIGN_ENUM_STR(__NR_request_key, result);
    CASE_ASSIGN_ENUM_STR(__NR_keyctl, result);
    CASE_ASSIGN_ENUM_STR(__NR_ioprio_set, result);
    CASE_ASSIGN_ENUM_STR(__NR_ioprio_get, result);
    CASE_ASSIGN_ENUM_STR(__NR_inotify_init, result);
    CASE_ASSIGN_ENUM_STR(__NR_inotify_add_watch, result);
    CASE_ASSIGN_ENUM_STR(__NR_inotify_rm_watch, result);
    CASE_ASSIGN_ENUM_STR(__NR_migrate_pages, result);
    CASE_ASSIGN_ENUM_STR(__NR_openat, result);
    CASE_ASSIGN_ENUM_STR(__NR_mkdirat, result);
    CASE_ASSIGN_ENUM_STR(__NR_mknodat, result);
    CASE_ASSIGN_ENUM_STR(__NR_fchownat, result);
    CASE_ASSIGN_ENUM_STR(__NR_futimesat, result);
    CASE_ASSIGN_ENUM_STR(__NR_newfstatat, result);
    CASE_ASSIGN_ENUM_STR(__NR_unlinkat, result);
    CASE_ASSIGN_ENUM_STR(__NR_renameat, result);
    CASE_ASSIGN_ENUM_STR(__NR_linkat, result);
    CASE_ASSIGN_ENUM_STR(__NR_symlinkat, result);
    CASE_ASSIGN_ENUM_STR(__NR_readlinkat, result);
    CASE_ASSIGN_ENUM_STR(__NR_fchmodat, result);
    CASE_ASSIGN_ENUM_STR(__NR_faccessat, result);
    CASE_ASSIGN_ENUM_STR(__NR_pselect6, result);
    CASE_ASSIGN_ENUM_STR(__NR_ppoll, result);
    CASE_ASSIGN_ENUM_STR(__NR_unshare, result);
    CASE_ASSIGN_ENUM_STR(__NR_splice, result);
    CASE_ASSIGN_ENUM_STR(__NR_tee, result);
    CASE_ASSIGN_ENUM_STR(__NR_sync_file_range, result);
    CASE_ASSIGN_ENUM_STR(__NR_utimensat, result);
    CASE_ASSIGN_ENUM_STR(__NR_epoll_pwait, result);
    CASE_ASSIGN_ENUM_STR(__NR_signalfd, result);
    CASE_ASSIGN_ENUM_STR(__NR_timerfd_create, result);
    CASE_ASSIGN_ENUM_STR(__NR_eventfd, result);
    CASE_ASSIGN_ENUM_STR(__NR_fallocate, result);
    CASE_ASSIGN_ENUM_STR(__NR_timerfd_settime, result);
    CASE_ASSIGN_ENUM_STR(__NR_timerfd_gettime, result);
    CASE_ASSIGN_ENUM_STR(__NR_accept4, result);
    CASE_ASSIGN_ENUM_STR(__NR_signalfd4, result);
    CASE_ASSIGN_ENUM_STR(__NR_eventfd2, result);
    CASE_ASSIGN_ENUM_STR(__NR_epoll_create1, result);
    CASE_ASSIGN_ENUM_STR(__NR_dup3, result);
    CASE_ASSIGN_ENUM_STR(__NR_pipe2, result);
    CASE_ASSIGN_ENUM_STR(__NR_inotify_init1, result);
    CASE_ASSIGN_ENUM_STR(__NR_perf_event_open, result);
    CASE_ASSIGN_ENUM_STR(__NR_fanotify_init, result);
    CASE_ASSIGN_ENUM_STR(__NR_fanotify_mark, result);
    CASE_ASSIGN_ENUM_STR(__NR_prlimit64, result);
    CASE_ASSIGN_ENUM_STR(__NR_name_to_handle_at, result);
    CASE_ASSIGN_ENUM_STR(__NR_open_by_handle_at, result);
    CASE_ASSIGN_ENUM_STR(__NR_clock_adjtime, result);
    CASE_ASSIGN_ENUM_STR(__NR_syncfs, result);
    CASE_ASSIGN_ENUM_STR(__NR_setns, result);
    CASE_ASSIGN_ENUM_STR(__NR_getcpu, result);
    CASE_ASSIGN_ENUM_STR(__NR_kcmp, result);
    CASE_ASSIGN_ENUM_STR(__NR_finit_module, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_setattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_sched_getattr, result);
    CASE_ASSIGN_ENUM_STR(__NR_rt_sigaction, result);
    CASE_ASSIGN_ENUM_STR(__NR_rt_sigreturn, result);
    CASE_ASSIGN_ENUM_STR(__NR_ioctl, result);
    CASE_ASSIGN_ENUM_STR(__NR_readv, result);
    CASE_ASSIGN_ENUM_STR(__NR_writev, result);
    CASE_ASSIGN_ENUM_STR(__NR_recvfrom, result);
    CASE_ASSIGN_ENUM_STR(__NR_sendmsg, result);
    CASE_ASSIGN_ENUM_STR(__NR_recvmsg, result);
    CASE_ASSIGN_ENUM_STR(__NR_execve, result);
    CASE_ASSIGN_ENUM_STR(__NR_ptrace, result);
    CASE_ASSIGN_ENUM_STR(__NR_rt_sigpending, result);
    CASE_ASSIGN_ENUM_STR(__NR_rt_sigtimedwait, result);
    CASE_ASSIGN_ENUM_STR(__NR_rt_sigqueueinfo, result);
    CASE_ASSIGN_ENUM_STR(__NR_sigaltstack, result);
    CASE_ASSIGN_ENUM_STR(__NR_timer_create, result);
    CASE_ASSIGN_ENUM_STR(__NR_mq_notify, result);
    CASE_ASSIGN_ENUM_STR(__NR_kexec_load, result);
    CASE_ASSIGN_ENUM_STR(__NR_waitid, result);
    CASE_ASSIGN_ENUM_STR(__NR_set_robust_list, result);
    CASE_ASSIGN_ENUM_STR(__NR_get_robust_list, result);
    CASE_ASSIGN_ENUM_STR(__NR_vmsplice, result);
    CASE_ASSIGN_ENUM_STR(__NR_move_pages, result);
    CASE_ASSIGN_ENUM_STR(__NR_preadv, result);
    CASE_ASSIGN_ENUM_STR(__NR_pwritev, result);
    CASE_ASSIGN_ENUM_STR(__NR_rt_tgsigqueueinfo, result);
    CASE_ASSIGN_ENUM_STR(__NR_recvmmsg, result);
    CASE_ASSIGN_ENUM_STR(__NR_sendmmsg, result);
    CASE_ASSIGN_ENUM_STR(__NR_process_vm_readv, result);
    CASE_ASSIGN_ENUM_STR(__NR_process_vm_writev, result);
    CASE_ASSIGN_ENUM_STR(__NR_setsockopt, result);
    CASE_ASSIGN_ENUM_STR(__NR_getsockopt, result);
    default:
      result = base::StringPrintf("%d???", sysno);
      break;
  }
  return result;
}
#endif

std::string GetSyscallStr(int sysno) {
#if defined(__arm__)
  return GetArmSyscallStr(sysno);
#else
  return GetX86SyscallStr(sysno);
#endif
}

}  // namespace arc
